package com.luo.chengrui.framework.sadatapermission.core.annotation;

import com.luo.chengrui.framework.sadatapermission.core.rule.DataPermissionRule;

import java.lang.annotation.*;

/**
 * 数据权限注解
 * 可声明在类或者方法上，标识使用的数据权限规则
 *
 * @author 芋道源码
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface SaDataPermission {

    /**
     * 当前类或方法是否开启数据权限
     * 即使不添加 @DataPermission 注解，默认是开启状态
     * 可通过设置 enable 为 false 禁用
     */
    boolean enable() default true;

    /**
     * 权限注解名称，
     * 当注解设置了name属性时，如下：
     *
     * @SaDataPermission(name="abc" likeTargetColumn = "full_id", permissinCode = "orgBasicPermi")，
     * 当从DataPermissionContextHolder 获取permission-code的值为：abc@orgManagerPermi时，注解中permissionCode将为实更新为：orgManagerPermi。
     * 以此来实现动态权限控制。不用新增一个权限控制方式就新增一个方法。
     */
    String name() default "";

    /**
     * 权限定义编码和子项编码均可使用，效果一样。建议是使用子项编码，便于后期权限独立配置。
     */
    String permissinCode() default "";

    /**
     * 需要控制权限的目标表名，为空时根据 权限定义中的表名进行匹配
     * 若配置了该值，值使用该表名去匹配脚本中的表。若匹配不上就不做权限控制。
     *
     * @return
     */
    String targetTable() default "";

    /**
     * like 生成like子句时，使用的字段名，未配置时默认使用 targetColumn字段值。
     *
     * @return
     */
    String likeTargetColumn() default "";

    /**
     * 目标字段名，为空时根据权限定义中的外键字段名进行匹配
     * 若配置了该值，则优化使用此配置
     *
     * @return
     */
    String targetColumn() default "";

    /**
     * 生效的数据权限规则数组，优先级高于 {@link #excludeRules()}
     */
    Class<? extends DataPermissionRule>[] includeRules() default {};

    /**
     * 排除的数据权限规则数组，优先级最低
     */
    Class<? extends DataPermissionRule>[] excludeRules() default {};

}
